perm filename QA5[1,DBL] blob
sn#016202 filedate 1972-12-12 generic text, type T, neo UTF8
00100 BEGIN
00200 EXPR ENTER();
00300 BEGIN
00400 PRINTSTR '"THE SYSTEM IS STARTED";
00500 S;PRINTSTR '"
00600
00700 PLEASE TYPE IN A REQUEST
00800
00900 ...";
01000 L←READ();
01050 LHOLD←L;
01100 IF NULL(L) THEN RETURN '"THE SYSTEM IS ENDED.";
01200 PRINT D(L);
01300 GO S;
01400 END;
01500 EXPR D(L);
01600 BEGIN NEW FN, A, N, RELATEDF;
01700 I←READINKNOWN();
01701 KNOWNF←IDATA[1];
01750 TARG←IDATA[2];
01775 NARG←IDATA[3];
01787 TRE←IDATA[4];
01793 BA1←IDATA[5];
01796 BA2←IDATA[6];
01800 FN←L[1];
01900 A←CDR(L);
02000 N←LENGTH(A);
02100 RELATEDF←'(NIL NIL NIL NIL);
02200 IF MEMBER(FN,KNOWNF) THEN RETURN K1(FN,A,N,RELATEDF)
02300 ELSE RETURN K2(FN,A,N,RELATEDF);
02400 END;
02500 EXPR INIT();
02600 BEGIN
02700 EXAMPLE←NIL;
02800 INF←0;
02900 ORD←'(NIL);
03000 PRINTSTR '"TYPE IN HOW DEEPLY WE SHOULD RECURSE BEFORE
03100 GIVING UP AS INFINITE LOOP (I SUGGEST 50) ...";
03200 LIMINFBASE←READ();
03300 F3 ← '(NIL); F2← F3; F4←F3; F5←F4; F6←F5; F7←F6;
03400 BA1←'(FN CAR CDR IDEN MINUS ATOM LISTP NUMBERP NULL
03500 LIST CONST1 ZERO1
03600 QUOTE EVAL LENGTH NOT HALF SUB1 ADD1 );
03700 BA2←'(CONS PI12 PI22 PLUS TIMES MEMBER APPEND
03800 GREATERP LESSP EQUAL AND OR NOT);
03900 PRINTSTR '"TYPE IN MESSAGE LEVEL (I SUGGEST 3)...";
04000 MSGLEVEL←READ();
04100 KNOWNF ←'(CAR CDR CONS IDEN
04200 PLUS TIMES MINUS
04300 ATOM LISTP NUMBERP NULL
04400 QUOTE EVAL
04500 LENGTH MEMBER
04600 GREATERP LESSP EQUAL
04700 AND OR NOT
04800 HALF PI12 PI22 ZERO1 ZERO2
04900 CONST1 CONST2 SUB1 ADD1 LIST APPEND FN);
05000 SCHEMA←'(DE FN(L) (COND
05100 ((EQUAL (F1 L) C1) (F2 L))
05200 ((EQUAL (F8 L) C3) (F9 L))
05300 ((OR (GT L) (AND (INFINITY ) ((CAR (GET F4 TARGS)) (F3 L))
05400 ((CAR (GET F6 TARGS)) (F5 L))
05500 ((CAR (GET F7 TARGS)) (F4 (F3 L)))
05600 ((CADR (GET F7 TARGS)) (F6 (F5 L))) ))
05700 (F7 (F4 (F3 L)) (F6 (F5 L))))
05800 (T C2)));
05900 I ← EVAL(SCHEMA);
06000 NARGS←'NARGS; TARGS←'TARGS;TRES←'TRES;
06100 RETURN PUTFORM();
06200 END;
06300 EXPR IDEN(A); A;
06400 EXPR HALF(A); A/2;
06500 EXPR K1(FN,A,N,RELATEDF);
06600 BEGIN NEW I;
06700 I← GET(FN,'NARGS);
06800 IF I=N OR I=11 THEN RETURN EVAL(L);
06900 PRINTSTR '"THIS FUNCTION TAKES EXACTLY";
07000 PRIN1(I);
07100 PRINTSTR '" ARGUMENT(S). ARE WE DEFINING A NEW BUT CLOSELY
07200 RELATED FUNCTION Y OR N ...";
07300 IF READ()='Y THEN RELATEDF[1,1]←FN
07400 ELSE PRINTSTR '"ARE WE DEFINING A NEW FUNCTION HERE OR
07500 NOT Y OR N ..."
07600 ALSO IF READ()='N THEN RETURN '"IGNORING THE REQUEST ENTIRELY";
07700 PRINTSTR '"PICK A NEW FUNCTION NAME TO REPLACE THIS NEWEST USE OF";
07800 PRIN1 FN;
07900 PRINTSTR '"...";
08000 FN←READ();
08100 IF MEMBER(FN,KNOWNF) THEN RETURN K1(FN,A,N,RELATEDF)
08200 ELSE RETURN K2(FN,A,N,RELATEDF);
08300 END;
08400 EXPR K2(FN,A,N,RELATEDF);
08500 BEGIN NEW II,I;
08600 PRINTSTR '"READY TO MAKE NEW FUNCTION. DO YOU WANT TO";
08700 PRINTSTR '" CHANGE YOUR REQUEST Y OR N...";
08800 IF READ()='Y THEN RETURN '"VERY WELL. IGNORING
08900 THE REQUEST ENTIRELY";
09000 FOR NEW J←1 TO LENGTH(KNOWNF)-1 DO
09100 PUTPROP(KNOWNF[J],NIL,'RVAL);
09200 F1←NIL; F2←NIL; F8←NIL;F9←NIL; EXAMPLE←NIL;
09300 CO←CDR(BA1); ORDER←<CO,CO,CO,BA1,CO,BA1,BA2>;
09400 PRINTSTR '"FOR EACH OF THE FOLLOWINGS FUNCTIONS, TYPE
09500 EITHER TH WORD STOP OR A FUNCTION NAME, A SPACE, AND THEN A
09600 1/2/3/4/5, MEANING THAT THE FN. IS DEFINITELY/PROBABLY/POSSIBLY
09700 /PROBABLY NOT/DEFINITELY NOT RELATED TO";
09800 PRIN1 (FN);
09900 PRINT (KNOWNF);
10000 FOR NEW J←1 TO LENGTH(KNOWNF) DO BEGIN
10100 S; I←READ();
10200 IF I= 'STOP THEN GO SSS;
10300 II←READ();
10400 PUTPROP (I, II, 'RVAL);
10500 IF MEMBER(II,'(1 2 3 4)) THEN
10600 RELATEDF[II] ← I CONS RELATEDF[II]
10700 ELSE IF NOT(I=5) THEN
10800 PRINTSTR '"NO,NO! TYPE IN ONE DIGIT FROM 1 TO 5!!!"
10900 ALSO GO S;
11000 SSS; END UNTIL I= 'STOP;
11100 PRINTSTR '"DO YOU THINK RECURSION (OR AN AUXILLIARY FN. WILL
11200 BE REQUIRED HERE Y OR N OR M(FOR MAYBE) ...";
11300 I←READ();
11400 IF I='Y THEN RETURN REC(FN,A,N,RELATEDF)
11500 ELSE RETURN NREC(FN,A,N,RELATEDF,I);
11600 END;
11700 EXPR PUTFORM();
11800 BEGIN NEW ID,NA,TA,TR;
11900 TF←NIL;
12000 IF MAKELISTS()=NIL THEN RETURN PRINTSTR '"MAKELISTS IS NIL";
12100 FOR NEW I←1 TO LENGTH(KNOWNF) DO
12200 BEGIN
12300 PF←NIL;
12400 PF[1]←'PF1; PF[2]←'PF2; PF[3]←'PF3; PF[4]← 'PF4;
12500 PF[5]←'PF5; PF[6]←'PF6; PF[7]←'PF7;
12600 PF[8]←'PF8; PF[9]←'PF9;
12700 ID←KNOWNF[I];
12800 NA←NARG[I];
12900 PUTPROP(ID,NA,'NARGS);
13000 TA←TARG[I];
13100 PUTPROP(ID,TA,'TARGS);
13200 TR←TRE[I];
13300 PUTPROP(ID,TR,'TRES);
13400 FOR NEW J←1 TO 9 DO PUTPROP(ID,TF[J,I],PF[J]);
13500 PUTPROP('FN,2,'RVAL);
13600 PUTPROP('FALSE,'(ANY),TARGS);
13700 END;
13800 END;
13900 EXPR MAKELISTS();
14000 BEGIN
14100 NARG ← '(1 1 2 11 11 11 1
14200 1 1 1 1 1 1 1 2 11 11 11 11 11 11 1 2 2 1 2 1 2 1 1 11 2 1);
14300 TARG←'((LISTP) (LISTP) (ATOM LISTP) (ANY ANY)
14400 (NUMBER NUMBER) (NUMBER NUMBER)
14500 (NUMBER) (ANY) (ANY) (ANY) (ANY) (ANY) (ANY) (ANY)
14600 (ANY LISTP) (NUMBER NUMBER) (NUMBER NUMBER) (ANY ANY)
14700 (ANY ANY) (ANY ANY) (ANY ANY) (NUMBER) (ANY ANY) (ANY ANY)
14800 (ANY) (ANY ANY) (ANY) (ANY ANY) (NUMBER) (NUMBER)
14900 (ANY) (ANYLIST ANYLIST) (ANY));
15000 TRE←'(ANY LISTP LISTP ANY NUMBER NUMBER NUMBER
15100 TF TF TF TF ANY ANY
15200 NUMBER TF TF TF TF TF TF TF NUMBER ANY ANY NUMBER
15300 NUMBER ANY ANY NUMBER NUMBER ANYLIST LIST ANY);
15400 TF[1]← '(7 7 0 5 0 0 14 5 14 14 10 25 14 10 0 0 0 0 0 0
15500 14 10 0 0 25 0 25 0 10 10 14 0 0);
15600 TF[2]← '(10 10 0 5 0 0 14 5 14 14 14 25 14 14 0 0 0 0 0 0
15700 25 10 0 0 10 0 10 0 14 14 7 0 0);
15800 TF[3] ← '(5 7 0 10 0 0 10 14 14 14 14 14 14 14 0 0 0 0 0 0
15900 25 14 0 0 14 0 14 0 7 7 10 0 0);
16000 TF[4] ← '(7 10 0 7 0 0 14 14 14 14 14 14 14 14 0 0 0 0 0 0
16100 14 10 0 0 25 0 25 0 10 10 14 0 5);
16200 TF[5] ← '(7 5 0 10 0 0 10 14 14 14 14 14 14 14 0 0 0 0 0 0
16300 25 14 0 0 14 0 14 0 7 7 7 0 0);
16400 TF[6] ← '(10 7 0 7 0 0 14 14 14 14 14 14 14 14 0 0 0 0 0 0
16500 14 10 0 0 25 0 25 0 10 10 10 0 5);
16600 TF[7] ← '(0 0 5 0 10 10 0 0 0 0 0 0 0 0 25 25 14 25 14 14
16700 0 0 7 7 0 14 0 14 0 0 0 5 0);
16800 TF[8]←TF[1]; TF[9]←TF[2];
16900 RETURN PRINTSTR '"SUCCESFUL END OF MAKELISTS";
17000 END;
17100 EXPR FALSE(A); NIL;
17200 EXPR TRUE(A); T;
17300 EXPR GETEX(N8);
17400 BEGIN NEW I;
17500 N9 ← LENGTH(EXAMPLE) + 1;
17600 IF N9=1 THEN RETURN PRIM(NIL);
17700 S; PRINTSTR '"PLEASE GIVE ME AN EXAMPLE.";
17800 PRINTSTR '" THE ARGUMENT LIST...";
17900 EXAMPLE[N9,1]←READ();
18000 PRINTSTR '"THE FUNCTION VALUE...";
18100 EXAMPLE[N9,2]←READ();
18200 PRINTSTR '"DID YOU MAKE AN ERROR? ";
18300 I←READ();
18400 IF I='Y THEN GO S;
18500 RETURN EXAMPLE[N9];
18600 END;
18700 EXPR PI12(A,B); A;
18800 EXPR PI22(A,B); B;
18900 EXPR ZERO1(A); 0;
19000 EXPR ZERO2(A,B); 0;
19100 EXPR CONST1(A); 1;
19200 EXPR CONST2(A,B); NIL;
19300 EXPR INFINITY();
19400 BEGIN
19500 INF←INF+1;
19600 RETURN LESSP(INF,LIMINF);
19700 END;
19800 EXPR REC(FN,A,N,RELATEDF);
19900 BEGIN
20000 NEW I,II,I1,I2,KK,JJ1,JJ2;
20100 S; PRINTSTR '"WHICH: TYPE AN R(RECURSION), A(AUX.FN.), OR
20200 B(BOTH)...";
20300 I←READ();
20400 IF NOT(MEMBER(I,'(R A B))) THEN
20500 PRINTSTR '"NO,NO!! TYPE R,A, OR B ONLY..."
20600 ALSO GO S;
20700 IF NOT I='R THEN RETURN '"O.K. LET'S WORK ON THE AUX.FN.
20800 TYPE IT IN AS IF IT WERE YOUR REQUEST:";
20900 I←GETEX(1);
21000 NEX←0;
21100 PRINTSTR '"HOW MANY MORE EXAMPLES WILL YOU GIVE ME
21200 (I SUGGEST 2) ....";
21300 NEX←READ();
21400 FOR NEW KK←1 TO NEX DO II←GETEX(KK+1);
21500 L←CADAR(A);
21600 NEX ← NEX + ONEX;
21700 IF NOT(N=1) THEN GO SS; I←'(ANY);
21800 E←NIL; MA←T; MN←T; MAL←T; EXAMPLE[NEX+2,1]←L;
21900 FOR NEW X←1 TO NEX+1 DO BEGIN E←EXAMPLE[X+1,1];
22000 MA←MA AND ATOM(E); MN←MN AND NUMBER(E);
22100 MAL←MAL AND ANYLIST(E); END;
22200 IF MAL THEN I←'(ANYLIST);
22300 IF MA THEN I←'(ATOM);
22400 IF MN THEN I←'(NUMBER);
22500 PUTPROP('FN,I,'TARGS);
22600 PUTPROP('FN,1,'NARGS);
22700 PUTPROP('FN,'ANY,'TRES);
22800 IHOLD←I;
22900 PRINTSTR '"DO YOU KNOW THE TYPE OF ARGUMENTS
23000 FOR THE FN? MY GUESS IS"; PRINC (IHOLD);
23100 PRINTSTR '"ANSWER Y IF YOU WANT TO MAKE A BETTER GUESS,
23200 N IF YOU THINK THAT IT IS O.K. AS STATED ... ";
23300 I←READ(); IF I='Y THEN BEGIN PRINTSTR '"O.K. TYPE IN ONE
23400 OF TH FOLLOWING WORDS: ANY ANYLIST LISTP NUMBER...";
23500 I←READ();
23600 PUTPROP('FN,<I>,'TARGS);
23700 IHOLD←I;
23800 END;
23900 FOR NEW K←1 TO 7 DO
24000 ORD[K]←INTERSECTION(RELATEDF[1]@
24100 RELATEDF[2]@<'FN>@RELATEDF[3]
24200 @RELATEDF[4],ORDER[K]);
24300 ORD[8]←ORD[1]; ORD[9]←ORD[2];
24400 FOR NEW K←1 TO 9 DO ORD[K]←RANK(K,ORD);
24500 PRINTSTR '"DO YOU WANT TO CUT DOWN THE POSSIBILITIES
24600 EVEN FURTHER? Y OR N ..."; I←READ();
24700 IF I='Y THEN FOR NEW X←1 TO 9 DO BEGIN
24800 PRINT (<'ORD,X,ORD[X]>); PRINTSTR '"NOW RETYPE ORD[X]";
24900 I ← READ(); IF NOT(I='S) THEN ORD[X]←I;
25000 END;
25100 IF C1=UNKNOWN THEN C1←T;
25200 IF C3=UNKNOWN THEN C3←T;
25300 I←NIL; II←NIL;
25400 LIMINF←LIMINFBASE;
25500 FOR NEW T1←1 TO LENGTH(ORD[1]) DO BEGIN
25600 F1←ORD[1,T1];
25700 IF GREATERP(MSGLEVEL,0) THEN
25800 PRINT(<1,'T1,T1,'F1,F1,'L,L,'RELATEDF,RELATEDF,'ORD,ORD>);
25900 IF FOR NEW X←2 TO NEX+1 ; AND BEGIN
26000 E←EXAMPLE[X,1];
26100 RETURN EVAL '((CAR (GET F1 TARGS)) E) ;
26200 END AND
26300 (GOODEX=NIL OR F1(GOODEX[1])=C1) THEN
26400 FOR NEW T2←1 TO LENGTH(ORD[2]) DO BEGIN
26500 F2←ORD[2,T2];
26600 IF GREATERP(MSGLEVEL,1) THEN
26700 PRINT(<2,'T2,T2,'F2,F2>);
26800 IF FOR NEW X←2 TO NEX+1; AND BEGIN
26900 E←EXAMPLE[X,1];
27000 RETURN EVAL '((CAR (GET F2 TARGS)) E) ;
27100 END AND
27200 (NOT(GOODEX) OR F2(GOODEX[1])=GOODEX[2]) THEN
27300 FOR NEW T8←1 TO LENGTH(ORD[8]) DO BEGIN
27400 F8←ORD[8,T8];
27500 IF GREATERP(MSGLEVEL,9) THEN PRINT(<8,'T8,T8,'F8,F8>);
27600 IF FOR NEW X←2 TO NEX+1; AND BEGIN
27700 E←EXAMPLE[X,1];
27800 RETURN EVAL '((CAR (GET F8 TARGS)) E); END AND
27900 (GOODEX2=NIL OR F8(GOODEX2[1])=C3) THEN
28000 FOR NEW T9←1 TO LENGTH(ORD[9]) DO BEGIN
28100 F9←ORD[9,T9];
28200 IF GREATERP (MSGLEVEL,10) THEN PRINT(<9,'T9,T9,'F9,F9>);
28300 IF FOR NEW X←2 TO NEX+1; AND BEGIN
28400 E←EXAMPLE[X,1];
28500 RETURN EVAL '((CAR (GET F9 TARGS)) E); END AND
28600 (NOT(GOODEX2) OR F9(GOODEX2[1])=GOODEX2[2]) THEN
28700 FOR NEW T3←1 TO LENGTH(ORD[3]) DO BEGIN
28800 F3←ORD[3,T3];
28900 IF GREATERP(MSGLEVEL,2) THEN
29000 PRINT(<3,'T3,T3,'F3,F3>);
29100 IF FOR NEW X←2 TO NEX+1; AND BEGIN
29200 E←EXAMPLE[X,1];
29300 RETURN ( GT(E) OR EVAL '((CAR (GET F3 TARGS)) E) );
29400 END THEN
29500 FOR NEW T4←1 TO LENGTH(ORD[4]) DO BEGIN
29600 F4←ORD[4,T4];
29700 IF F4='FN THEN LIMINF← LIMINF + LIMINF;
29800 IF GREATERP(MSGLEVEL,3) THEN
29900 PRINT(<4,'T4,T4,'F4,F4,'GETF4TARGS,GET(F4,TARGS)>);
30000 IF FOR NEW X←2 TO NEX+1; AND BEGIN
30100 E←EXAMPLE[X,1];
30200 RETURN ( GT(E) OR EVAL '((CAR (GET F4 TARGS)) (F3 E) )) ;
30300 END THEN
30400 FOR NEW T5←1 TO LENGTH(ORD[5]) DO BEGIN
30500 F5←ORD[5,T5];
30600 IF GREATERP(MSGLEVEL,4) THEN
30700 PRINT (<5,'T5,T5,'F5,F5>);
30800 IF FOR NEW X←2 TO NEX+1; AND BEGIN
30900 E←EXAMPLE[X,1];
31000 RETURN (GT(E) OR EVAL '((CAR (GET F5 TARGS)) E)) ;
31100 END THEN
31200 FOR NEW T6←1 TO LENGTH(ORD[6]) DO BEGIN
31300 F6←ORD[6,T6];
31400 IF F6='FN THEN LIMINF← LIMINF + LIMINF;
31500 IF GREATERP(MSGLEVEL,5) THEN
31600 PRINT (<6,'T6,T6,'F6,F6,'(I HAVE CHOSEN LIMINF TO BE),LIMINF>);
31700 IF FOR NEW X←2 TO NEX+1; AND BEGIN
31800 E←EXAMPLE[X,1];
31900 RETURN ( GT(E) OR EVAL '((CAR (GET F6 TARGS)) (F5 E) )) ;
32000 END THEN
32100 FOR NEW T7←1 TO LENGTH(ORD[7]) DO BEGIN
32200 F7←ORD[7,T7];
32300 IF GREATERP(MSGLEVEL,6) THEN
32400 PRINT (<7,'T7,T7,'F7,F7>);
32500 JJ1← FOR NEW KK←2 TO NEX+2; AND BEGIN E←EXAMPLE[KK,1];
32600 RETURN (GT(E) OR
32700 EVAL('((CAR (GET F7 TARGS)) (F4 (F3 E))))); END;
32800 JJ2← FOR NEW HH←2 TO NEX+2; AND BEGIN E←EXAMPLE[HH,1];
32900 RETURN (GT(E) OR
33000 EVAL ('((CADR (GET F7 TARGS)) (F6 (F5 E)))))
33100 ; END;
33200 IF JJ1 AND JJ2 THEN INF←0
33300 ALSO I← FOR NEW X←2 TO NEX+1; AND BEGIN
33400 INF←0;
33500 E←EXAMPLE[X,1];
33600 RETURN (EXAMPLE[X,2] = EVAL '(FN E) );
33700 END;
33800 IF I THEN PRINTSTR '"
33900 HOORAY, HOORAY!!!
34000 SUCCESS!!
34100 ";
34200 RETURN I;
34300 END UNTIL I
34400 END UNTIL I
34500 END UNTIL I
34600 END UNTIL I
34700 END UNTIL I
34800 END UNTIL I
34900 END UNTIL I
35000 END UNTIL I
35100 END UNTIL I;
35200 IF GREATERP(MSGLEVEL,0) THEN
35300 PRINT <'F123456789,F1,F2,F3,F4,F5,F6,F7,F8,F9,'C1234,C1,C2,C3,C4>;
35400 KNOWNF← FN CONS KNOWNF; TARG ←GET('FN,'TARGS) CONS TARG;
35500 NARG←N CONS NARG; TRE ← GET('FN,'TRES) CONS TRE;
35600 BA1 ← FN CONS BA1; IF GREATERP(MSGLEVEL,2) THEN
35700 PRINT <'KNOWNF,KNOWNF,
35800 'TARGNARGTRE,TARG,NARG,TRE,'BA1,BA1>;
35900 FINALIZE();
36000 PUTPROP(FN,1,NARGS);
36100 PUTPROP(FN,IHOLD,TARGS);
36200 PUTPROP(FN,'(ANY),TRES);
36300 FOR NEW J←1 TO 9 DO PUTPROP(FN,11,PF[J]);
36400 RETURN FN; SS; RETURN '"SORRY, THIS ISN'T PROGRAMMED YET.";
36500 END;
36600 EXPR GT(E);
36700 OR( GOODEX AND GOODEX[1]=E, GOODEX2 AND GOODEX2[1]=E);
36800 EXPR INTERSECTION(A,B);
36900 BEGIN NEW III;
37000 III←NIL;
37100 FOR NEW JJJ IN A DO
37200 IF MEMBER(JJJ,B) THEN III← III @ <JJJ>;
37300 RETURN III;
37400 END;
37500 EXPR LISTP(A);AND( NOT(ATOM(A)), LENGTH(A) ≥ 1);
37600 EXPR ANY(A); T;
37700 EXPR NUMBER(A); NUMBERP(A);
37800 EXPR ANYLIST(A);OR(NULL(A),NOT(ATOM(A)));
37900 EXPR PRINTMATRIX();
38000 BEGIN NEW J;
38100 PRINTSTR '"FNAME TF1 TF2 TF3 TF4 TF5 TF6 TF7 TF8 TF9";
38200 FOR NEW I IN KNOWNF DO BEGIN
38300 J← FOR NEW K IN PF COLLECT
38400 <GET(I,K)>;
38500 RETURN PRINT (I CONS J);
38600 END;
38700 END;
38800 EXPR PRIM(NIL);
38900 BEGIN NEW I,I1,I2;
39000 GOODEX←NIL;
39100 GOODEX2 ← NIL;
39200 F8←NIL;
39300 F9←NIL;
39400 ONEX ← 0;
39500 F1 ← NIL;
39600 F2 ← NIL;
39700 UNKNOWN ← 'UNKNOWN;
39800 PRINTSTR '"THERE IS SOME TRIVIAL (PRIMITIVE) CASE (OR TWO).
39900 DO YOU KNOW ANYTHING ABOUT IT? Y OR N ...";
40000 I ← READ();
40100 IF I ='N THEN BEGIN
40200 IF GREATERP(MSGLEVEL,1) THEN PRINTSTR
40300 '"ASSUMING C1 TO BE T, C2 TO BE UNKNOWN";
40400 C1 ← T; C2 ← UNKNOWN;
40500 C3←T; C4←UNKNOWN;
40600 EXAMPLE[1] ← <C1,C2>;
40700 RETURN NIL; END ALSO RETURN NIL;
40800 PRINTSTR '"FOR SOME FUNCTIONS F1,F2 AND SOME CONSTANTS C1,C2
40900 WHEN F1(ARGUMENT)=C1 THEN THE VALUE OF YOUR FN IS C2=F2(ARG)
41000 NOTE: C2 MAY NOT ACTUALLY BE A CONSTANT (JUST TYPE UNKNOWN)
41100
41200 NOW TYPE IN A FUNCTION NAME OR THE WORD NIL FOR F1,F2
41300 AND A CONSTANT OR TH WORD UNKNOWN FOR C1,C2 :
41400 F1 ...";
41500 F1←READ();
41600 PRINTSTR '" F2 ...";
41700 F2 ← READ();
41800 PRINTSTR '" C1 ...";
41900 C1 ← READ();
42000 PRINTSTR '" C2 ...";
42100 C2 ← READ();
42200 EXAMPLE[1] ← <C1,C2>;
42300 PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS TRIVIAL CASE? ";
42400 PRINTSTR '"Y OR N ...";
42500 I ← READ();
42600 IF I='Y THEN I←GETEX(2) ALSO ONEX←1 ALSO GOODEX←EXAMPLE[2];
42700 IF GOODEX AND F1 THEN C1←F1(GOODEX[1]);
42800 IF GOODEX AND F2 THEN C2←F2(GOODEX[1]);
42900 PRINTSTR '"IS THERE ANOTHER TRIVIAL CASE? Y OR N...";
43000 I←READ();
43100 IF I='N THEN BEGIN
43200 C3←T; C4←UNKNOWN;
43300 F8←'FALSE; F9←'FALSE;
43400 END
43500 ALSO RETURN NIL;
43600 PRINTSTR '"FOR SOME FUNCTIONS F8,F9, AND SOME CONSTANTS C3,C4
43700 WHEN F8(ARGUMENT)=C3 HEN THE VALUE OF YOUR FUNCTION
43800 IS C3=F9(ARGUMENT)
43900 NOTE: C4 MAY NOT ACTUALLY BE A CONSTANT (SAY UNKNOWN)
44000
44100 AS BEFORE, TYPE IN SOMETHING FOR ....
44200 F8 F9 C3 C4 HERE:";
44300 F8←READ();F9←READ();C3←READ();C4←READ();
44400 PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS TRIVIAL CASE?
44500 Y OR N ...";
44600 I←READ();
44700 IF I='Y THEN I←GETEX(3) ALSO ONEX←ONEX+1 ALSO GOODEX2←EXAMPLE[3];
44800 IF GOODEX2 AND F8 THEN C3←F8(GOODEX2[1]);
44900 IF GOODEX2 AND F9 THEN C4←F9(GOODEX2[1]);
45000 RETURN NIL; END;
45100 EXPR RANK(K,LL);
45200 BEGIN NEW VAL,TEMP,OLDR,RL;
45300 L←LL;
45400 IF NULL(L[K]) THEN
45500 (IF K=7 THEN RETURN '(PI22) ELSE RETURN '(IDEN));
45600 IF K=1 AND F1 THEN RETURN <F1>;
45700 IF K=2 AND F2 THEN RETURN <F2>;
45800 IF K=8 AND F8 THEN RETURN <F8>;
45900 IF K=9 AND F9 THEN RETURN <F9>;
46000 VAL←NIL;
46100 II←NIL;
46200 II←L[K];
46300 L←II;
46400 LEN ← LENGTH(L);
46500 OLDL←L;
46600 FOR NEW II ←1 TO LEN DO
46700 BEGIN
46800 I←L[II];
46900 IF MEMBER(I,KNOWNF) AND
47000 GET(I,'RVAL) AND
47100 GET(I, PF[K]) AND NOT(GET(I,PF[K])=0) THEN
47200 VAL[II] ← TIMES( GET(I,PF[K]), GET(I,'RVAL))
47300 ELSE VAL[II] ← 1000;
47400 END;
47500 IF GREATERP(MSGLEVEL,20) THEN
47600 PRINT(<'VAL,VAL,'L,L>);
47700 FOR NEW KOUNTER←1 TO LEN DO
47800 FOR NEW I1←1 TO LEN-1 DO
47900 FOR NEW I2←I1+1 TO LEN DO
48000 IF GREATERP(VAL[I1],VAL[I2]) THEN BEGIN
48100 TEMP←VAL[I1]; VAL[I1]←VAL[I2]; VAL[I2]←TEMP;
48200 TEMP←L[I1]; L[I1]←L[I2]; L[I2]←TEMP;
48300 END;
48400 RL←L;
48500 TEMP← FOR NEW J←1 TO LEN COLLECT
48600 BEGIN IF VAL[J]=1000 THEN RETURN NIL
48700 ELSE RETURN <L[J]>;
48800 END;
48900 L ← TEMP;
49000 IF GREATERP(MSGLEVEL,9) THEN PRINT (<'OLDL,OLDL,'RANKEDL,
49100 RL, 'CHOPPEDL, L>);
49200 RETURN L;
49300 END;
49400 EXPR FINALIZE();
49500 BEGIN
49600 IF F4='FN THEN F4←FN; IF F6='FN THEN F6←FN;
49700 EVAL <'DE, FN, '(L),
49800 <'COND, <<'EQUAL, <F1, 'L>, C1>, <F2,'L>>,
49900 <<'EQUAL, <F8, 'L>, C3>, <F9, 'L>>,
50000 <'T,<F7, <F4, <F3, 'L>>,
50100 <F6, <F5, 'L>>>>>>;
50150 RETURN KEEP();
50200 END;
50300 EXPR PERMANENT();
50400 BEGIN NEW I;
50500 EVAL '(OUTC (OUTPUT DSK: PW1KNOWNF) NIL);
50600 PRINT(<KNOWNF,TARG,NARG,TRE,
50700 BA1,BA2> );
50800 EVAL '(OUTC NIL T);
50900 END;
51000 EXPR KEEP();
51100 BEGIN NEW I;
51200 PRINTSTR '"THE ANSWER TO YOUR REQUEST IS";
51300 PRINT (EVAL(LHOLD));
51400 PRINTSTR '"
51500
51600 DO YOU WISH TO ENTER THIS FUNCTION AS A PERMANENT PART
51700 OF THE SYSTEM? Y OR N...";
51800 I←READ();
51900 IF I='N THEN RETURN NIL;
52000 I← PERMANENT();
52100 IF GREATERP(MSGLEVEL,23) THEN PRINT
52200 (<'KNOWNF,KNOWNF,'TARG,TARG,'NARG,NARG,'TRE,TRE,'BA1,
52300 BA1,'BA2,BA2>);
52400 RETURN NIL; END;
52500 EXPR READINKNOWN();
52600 BEGIN NEW I;
52700 I←EVAL '(INC (INPUT DSK: PW1KNOWNF) NIL);
52800 IDATA←NIL;
52900 IDATA← READ();
53000 I←EVAL '(INC NIL T);
53100 IF GREATERP(MSGLEVEL ,24) THEN PRINT (<'IDATA,
53200 IDATA>);
53300 RETURN NIL; END;
53400 END.